#ifndef PROCESADORDETAREAS_H_
#define PROCESADORDETAREAS_H_

#include <list>
#include <vector>
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <string.h>
#include <stddef.h>
#include <iostream>

#include "ArbolB+/ArbolBMas.h"
#include "IndexarDiccionario/DictionaryManager.h"
#include "IndexarDiccionario/Indexador.h"
#include "IndexarDiccionario/Sort.h"
#include "IndexarDiccionario/StopWords.h"
#include "CSV/FrasesFile.h"
#include "Comunes/Constantes.h"
#include "Comunes/MapaEspacioLibre.h"
#include "Comunes/Entidades/RecordTermino.h"
#include "Comunes/Entidades/RecordFrase.h"
#include "Comunes/Archivos/Logger.h"
#include "Hash/Hash.h"


using namespace std;
using namespace dictionary;
using namespace indexador;
using namespace ordenamiento;


class AuxiliarEstadisticaRanking{
private:
	string termino;
	int cantidad;
public:
	string get_termino(){
		return this->termino;
	}
	int get_cantidad(){
		return this->cantidad;
	}

	string toString(){
		return Palabra::intToString(this->cantidad) + "      " + this->termino;
	}

	bool operator>(const AuxiliarEstadisticaRanking& est) const{
		return this->cantidad > est.cantidad;
	}

	AuxiliarEstadisticaRanking(){
	}

	AuxiliarEstadisticaRanking(string termino, int cantidad){
		this->termino = termino;
		this->cantidad = cantidad;
	}
	virtual ~AuxiliarEstadisticaRanking(){
	}
};

class ProcesadordeTareas{

private:
	ArbolBMas * arbol;
	Hash * hash;
	Logger * logger;
	string directorio_raiz;
	string path_diccionario;
	string path_frases;
	string path_stopwords;
	string path_arbol;
	string path_hash;

	int terminos_guardados;
	void cargar_arbol_default(); /* obtiene los datos de un arbol ya cargado*/

	void borrar_directorios();   /* borra los directorios*/
	void crear_directorios();    /* crea los directorios */
	void crear_arbol_terminos(); /* crea el arbol desde cero */
	void crear_hash_frases();    /* crea la tabla y el archivo de cubos desde cero*/

public:
	ProcesadordeTareas(string dir_raiz);

	string get_path_arbol();
	string get_path_hash();

	/**** DICCIONARIO ****/
	void normalizar_diccionario();
	void indexar_diccionario_aleatorio();
	void ordenar_diccionario_aleatorio();

	/**** ARBOL TERMINOS ****/
	void crear_arbol(bool precargado, int m);
	void cargar_arbol_terminos();
	string buscar_termino(string termino);
	void insertar_termino(string termino, string num = "0");

	/**** HASH FRASES ****/
	string buscar_frase(int clave);
	void insertar_frase(int clave, string nombre_autor, string apellido_autor, string frase);
	void modificar_frase(int clave, string nombre_autor, string apellido_autor, string frase);
	void eliminar_frase(int clave);
	void crear_archivo_frases_long_fija();

	/**** ESTADISTICAS ****/
	float estadistica_terminos_promedio_por_frase();
	float estadistica_tasa_de_fallos();

	/**** REPORTES ****/
	void reporte_cubos();
	void reporte_terminos_ordenados();
	void reporte_estructura_arbol();

	/**** LISTADOS ****/
	list<string> lista_terminos_no_encontrados();
	list<string> lista_ranking_terminos_populares(int n);


	virtual ~ProcesadordeTareas();
};

#endif /* PROCESADORDETAREAS_H_ */
